"""
    对象的最大特征就是在于其拥有属性, 可以发现, 使用class关键字定义一个空类, 这个类就算不实例化, 也会拥有一些属性, 也就是说类本
身也是一个对象, 除了使用class关键字, 还可以通过type()定义类.

    type(name, bases, attrs) 参数说明: name是一个字符串, 用来表示类名; bases是一个数组, 用来表示基类; attrs是一个字典, 用来表
示类的属性和方法; type是一个类, 通过type(name, bases, attrs)方式对type调用时, 实际调用的是type.__new__()方法.

    也是说如果继承type, 并重写__new__()方法, 那就可以在解释器定义类的时候, 再执行一些其他逻辑. 比如: 类的方法加了__前缀的话, 会
自动改名, 想改变这点就需要重写__new__.

    元类: 继承了type的类就是元类
"""


class MyType(type):
    """定义一个元类"""

    def __new__(mcs, name, bases, attrs):
        print('=' * 50)
        print('name:', name)
        print('bases:', bases)
        print('attrs:', attrs)
        # 不是type的子类不能调用type的__new__()方法
        return type.__new__(mcs, name, bases, attrs)


# 使用type定义类示例
A = type('A', (), {})

# 使用元类方式(1)
B = MyType('B', (), {})


# 使用元类方式(2)
class C(metaclass=MyType):
    pass


"""output
==================================================
name: B
bases: ()
attrs: {}
==================================================
name: C
bases: ()
attrs: {'__module__': '__main__', '__qualname__': 'C'}
"""
